package com.util;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Random;
import java.util.StringTokenizer;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.servlet.jsp.JspWriter;

import org.apache.log4j.Logger;

public class UtilCommon
{
	private static Logger logger = Logger.getLogger( UtilCommon.class );
	public static String  host = "http://192.168.0.16";
	private int totalPage;		// 총페이지
	private int startPage;		// 시작페이지
	private int endPage;		// 종료페이지
	
	public int getTotalPage() {
		return totalPage;
	}
	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
	public int getStartPage() {
		return startPage;
	}
	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}
	public int getEndPage() {
		return endPage;
	}
	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}

	// 스크립트 제거 매소드
    public String getRemoveScript(String strContent)
    {
    	Pattern patternScript=Pattern.compile("(?i)\\<script(.*?)</script>");
    	Pattern patternMouseOver=Pattern.compile("(?i) onmouseover=[\"']?([^>\"']+)[\"']*");
    	Pattern patternMouseOut=Pattern.compile("(?i) onmouseout=[\"']?([^>\"']+)[\"']*");
    	Pattern patternMouseClick=Pattern.compile("(?i) onclick=[\"']?([^>\"']+)[\"']*");
    	Pattern patternBody=Pattern.compile("(?i)\\<body(.*?)>");
    	Pattern patternIframe=Pattern.compile("(?i)\\<iframe(.*?)</iframe>");

    	Matcher matcherContent=patternScript.matcher(strContent);
    	strContent=matcherContent.replaceAll("");
    	Matcher matcherMouseOver=patternMouseOver.matcher(strContent);
    	strContent=matcherMouseOver.replaceAll("");
    	Matcher matcherMouseOut=patternMouseOut.matcher(strContent);
    	strContent=matcherMouseOut.replaceAll("");
    	Matcher matcherMouseClick=patternMouseClick.matcher(strContent);
    	strContent=matcherMouseClick.replaceAll("");
    	Matcher matcherBody=patternBody.matcher(strContent);
    	strContent=matcherBody.replaceAll("");
    	Matcher matcherIframe=patternIframe.matcher(strContent);
    	strContent=matcherIframe.replaceAll("");
   		return strContent;
    }

	public void setPage(int total, int pagesize, int page, int pageblock)
	{
		int lastpage  = 1;
		int pageStart = 1;
		int pageEnd   = 1;
		
	    // 전체 페이지 구하기
	    if (total % pagesize > 0) {
	        lastpage = (total / pagesize) + 1; 
	    } else {
	        lastpage = (total / pagesize); 
	    }
	    pageStart = (int)((page-1)/pageblock) * pageblock + 1;
	    pageEnd   = pageStart + pageblock - 1;
	    if (pageEnd > lastpage) pageEnd = lastpage;
	    
	    this.setTotalPage(lastpage);
	    this.setStartPage(pageStart);
	    this.setEndPage(pageEnd);
	}
	
	private static int iCount = (new Random()).nextInt();

	/**
	 * 문자열에서 변경하고자 하는 Session 값을 변환시켜 return 한다.
	 * 
	 * @param request request 객체
	 * @param strSrc 문자열
	 * @return 변환된 문자열
	 */
	public static String replaceSession(javax.servlet.http.HttpServletRequest request, String strSrc)
	{
		String strBuf = "";
		javax.servlet.http.HttpSession session = request.getSession(true);

		if (!strSrc.equals(""))
		{

			strBuf = strSrc;
			int cIdx = 0;
			int fIdx = 0;
			int fIdxend = 0;
			String strFind1 = "";
			String strFind2 = "";
			String strReplace = "";

			while ((strBuf.indexOf(strFind1, cIdx) != -1) && (cIdx < strBuf.length()))
			{
				fIdx = strBuf.indexOf(strFind1, cIdx);
				fIdxend = strBuf.indexOf(strFind2, cIdx);
				strReplace = (String) session.getAttribute(strBuf.substring(fIdx
						+ strFind1.length(), fIdxend));
				strBuf = strBuf.substring(0, fIdx) + strReplace
				+ strBuf.substring(fIdxend + strFind2.length());
			}
		}

		return strBuf;
	}


	/**
	 * 날짜를 / 로 나누어 return 한다.
	 * 
	 * @param strDate 날짜 문자열
	 * @return "/"로 구분된 날짜 문자열
	 */
	public static String SplitDate(String strDate)
	{
		if (strDate != "" && strDate != null)
		{
			strDate = strDate.substring(0, 4) + "/" + strDate.substring(4, 6) + "/"
			+ strDate.substring(6, 8);
		}
		return strDate;
	}


	/**
	 * 문자열이 null 이거나 "" 인지 확인하여 ""를 넣어 준다. 그 외의 경우에는 원래의 문자를 return 한다.
	 * 
	 * @param arg 문자열
	 * @return 변환된 문자열
	 */
	public static String GF_NULL(String arg)
	{
		if (arg == null || arg == "")
		{
			arg = "";
		}
		return arg;
	}


	/**
	 * 문자열이 NULL인 경우 빈문자열(""), 아닌 경우에는 trim()된 문자열을 구한다.
	 * 
	 * @param str 문자열
	 * @return 변환된 문자열
	 */
	public static String Trim(String str)
	{
		if (str == null)
		{
			return "";
		}
		return str.trim();
	}


	/**
	 * 문자열이 Null이거나 빈문자열인지 체크
	 * 
	 * @param str
	 * @return Null이거나 빈문자열이면 True, otherwise false.
	 */
	public static boolean isNullOrEmpty(String str) {
		return Trim(str).length()==0;
	}


	/**
	 * 전화번호에 '-'을 추가하기
	 * 
	 * @param phone1 전화번호1 "02"
	 * @param phone2 전화번호2 "345"
	 * @param phone3 전화번호3 "9080"
	 * @return String "02-345-9080"
	 */
	public static String addPhoneHyphen(String phone1, String phone2, String phone3)
	{
		if (phone1 == null) phone1 = "";
		if (phone2 == null) phone2 = "";
		if (phone3 == null) phone3 = "";

		return phone1 + '-' + phone2 + '-' + phone3;
	}


	/**
	 * 전화번호에서 '-'을 토큰으로 잘라내기
	 * 
	 * @param phoneWithHyphen 하이픈 붙은 전화번호 "02-784-9871"
	 * @return 변환된 전화번호
	 */
	public static String[] removePhoneHyphen(String phoneWithHyphen)
	{
		StringTokenizer stPhone = new StringTokenizer(phoneWithHyphen, "-");
		String[] retPhone = new String[stPhone.countTokens()];

		for (int i = 0; i < retPhone.length; i++)
		{
			retPhone[i] = stPhone.nextToken();
		}

		return retPhone;
	}


	/**
	 * 문자열에서 특수 문자를 찾아 Decimal값으로 변경하여 return 한다.
	 * 
	 * @param strText 문자열
	 * @return 변환된 문자열
	 */
	public static String convert(String strText)
	{
		String strInput;
		StringBuffer strOutput = new StringBuffer("");
		String convert;
		char strTmp;
		int nCount;

		if (strText == null)
		{
			strText = "";
		}

		strInput = strText;
		nCount = strInput.length();

		for (int i = 0; i < nCount; i++)
		{

			strTmp = strInput.charAt(i);

			if (strTmp == '<') strOutput.append("&lt;");
			else if (strTmp == '>') strOutput.append("&gt;");
			else if (strTmp == '&') strOutput.append("&amp;");
			else if (strTmp == (char) 37) strOutput.append("&#37;");
			else if (strTmp == (char) 34) strOutput.append("&quot;");
			else if (strTmp == (char) 39) strOutput.append("&#39;");
			else if (strTmp == '#') strOutput.append("&#35;");
			else if (strTmp == ' ') strOutput.append("&#32;");
			else if (strTmp == '\\') strOutput.append("&#92;");
			else strOutput.append(strTmp);

		}

		convert = strOutput.toString();
		return convert;

	}

	/**
	 * 특수문자에 \를 붙여준다. JSP에서 Javascript로 문자열을 넘길때 들어가는 특수문자열을 escape함
	 * @param	str		입력문자열
	 * @return
	 */
	public static String escapeSpecialChar(String str) {
		str = str.replaceAll("\'","\\\'");
		str = str.replaceAll("\"","\\\"");
		//str = str.replaceAll("\\","\\\\\\");
		return str;
	}


	private synchronized static int getCount()
	{
		++iCount;
		iCount = (iCount >= 100 || iCount < 100) ? 100 : iCount;
		return iCount;
	}

	/**
	 * 현재의 날짜와 시간에 해당하는 아이디를 만들고 parameter와 합쳐서 return 한다.
	 * 
	 * @param str 접두 문자열
	 * @return 아이디
	 */
	public static String idMake(String str)
	{
		String id;

		try
		{
			int count = getCount();
			SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmssSSS", new Locale("ko","KO"));
			String formattedValue = formatter.format(new Date());
			id = str + formattedValue + count;
			return id;
		}
		catch (Exception e)
		{
			e.printStackTrace();
			return str;
		}
	}

	/**
	 * Javascrpt의 alert창을 띄워줌
	 */
	public static void scriptAlert(JspWriter out, String msg) {
		if(msg==null || msg.equals("")) {
			return;
		}
		scriptAlert(out, msg, "");
	}

	/**
	 * Javascrpt의 alert창을 띄워주고 추가 액션을 취할 경우
	 */
	public static void scriptAlert(JspWriter out, String msg, String opt) {
		if(msg==null || msg.equals("")) {
			return;
		}
		try {
			StringBuffer sb = new StringBuffer();
			out.println("<script type='text/javascript'>");
			sb.append("alert(\"").append(msg).append("\");");
			if (!opt.equals("")) {
				sb.append(opt);
			}
			sb.append("</script>");
			out.print(sb.toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 일반적인 Javascript를 실행시켜 줌 
	 * @param out
	 * @param script
	 */
	public static void script(JspWriter out, String script) {
		if(script==null || script.equals("")) {
			return;
		}
		try {
			out.println("<script type='text/javascript'>");
			out.println(script);
			out.println("</script>");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
    /**
     * 숫자형의 값을 콤마가 포함된 화폐단위로 리턴
     *
     * @param double dblNumber 바뀌어야할 문자열 값이다.
     * @return String 바뀌어진 값을 넘겨준다.
     */
    public static String addComma(Object obj) {

        String str = "";

        if(obj!=null) {
            str = obj+"";

            if(str.length() <= 3) {
                return str;
            } else {
                StringBuffer sb=new StringBuffer(str);
                int index=-3;

                for(int i=str.trim().length(); i>3; i -= 3)
                {
                    sb.insert(i+index,",");
                }

                String chgStr = sb.toString();

                return chgStr;
            }
        } else {
            logger.error("DATA가 NULL이군요...");
            return "0";
        }
    }	
    
    /**
     * 입력된 파일명을 파싱하여 확장자를 구한다.
     * @author Administrator
     * @param filename
     * @return
     * @date   2007. 06. 01
     */
    public static String getFileExt(String filename) {

        String ext = "";

        if(filename==null || "".equals(filename)) {
            ext = "";
        } else {
            if(filename.indexOf(".")>-1) {
                ext = filename.substring(filename.lastIndexOf(".")+1, filename.length());
            }
        }

        return ext;
    }    
}
